home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 8
/
FM Towns Free Software Collection 8.iso
/
t_os
/
artemis
/
artsrc2
/
gline.asm
< prev
next >
Wrap
Assembly Source File
|
1994-06-01
|
4KB
|
265 lines
; 私製ライブラリ・グラフィック篇
; (c) MATSUUCHI Ryosuke in Dec,1992
;
; gline.asm
;
; 1992. 8. 2(Sun)
; 1992.12.28(Sun)
public gline,_gline
extrn _gwrtreg:near, _gpset:near
extrn _ghline:near, _gvline:near
include grplib.inc
assume cs:cseg, ds:dseg
POSIT struc
x dd 0
y dd 0
POSIT ends
setPOS macro var,xreg,yreg
mov [var.x],xreg
mov [var.y],yreg
endm
incPOSx macro var
inc [var.x]
endm
decPOSx macro var
dec [var.x]
endm
incPOSy macro var ;eax を壊す
mov eax,[ydir]
add [var.y],eax
endm
decPOSy macro var ;eax を壊す
mov eax,[ydir]
sub [var.y],eax
endm
psetPOS macro var
local norm
pushad
mov eax,[var.x]
mov ebx,[var.y]
mov ecx,[color]
mov edx,[logop]
cmp [linetype],1
jnz norm
xchg eax,ebx
norm: call _gpset
popad
endm
dseg segment dword 'DATA'
x1 dd 0
y1 dd 0
x2 dd 0
y2 dd 0
xlen dd 0
ylen dd 0
ydir dd 0
p1 POSIT <>
p2 POSIT <>
rate dd 0
rateacc dd 0
ct dd 0
color dd 0
logop dd 0
linetype dd 0 ;0=[xlen > ylen] 1=[xlen < ylen] 2=[xlen = ylen]
;3=[xlen = 0 ] 4=[ylen = 0 ]
dseg ends
cseg segment dword 'CODE'
;---------------------------------------------------------------
; _gline : 直線の描画
; in EAX : x1
; EBX : y1
; ECX : x2
; EDX : y2
; ESI : color
; EDI : logop
;
; void gline(int x1,int y1,int x2,int y2,int col,int logop);
;---------------------------------------------------------------
gline proc near
push ebx
push esi
push edi
pushfd
mov eax,[esp+16+4]
mov ebx,[esp+16+8]
mov ecx,[esp+16+12]
mov edx,[esp+16+16]
mov esi,[esp+16+20]
mov edi,[esp+16+24]
call _gline
popfd
pop edi
pop esi
pop ebx
ret
gline endp
_gline proc near
call _gline_init
cmp [linetype],3
jl #6
call _gline_hv
jmp #7
#6:
pushad
xor ecx,ecx
#0:
cmp ecx,[ct]
jnl #1
psetPOS p1
;psetPOS p2
cmp [linetype],2
jge #3
mov eax,[rate]
add [rateacc],eax
jnc #2
incPOSy p1
;decPOSy p2
#2:
jmp #4
#3:
incPOSy p1
;decPOSy p2
#4:
inc ecx
incPOSx p1
;decPOSx p2
jmp #0
#1:
;bt [xlen],0
;jnc #5
; psetPOS p1
;#5:
popad
#7:
ret
_gline endp
;● LINE のサブルーチン(各変数をパラメーターから算出する)
;----------------------------------------------------------------------------
_gline_init proc
pushad
mov [color],esi
mov [logop],edi
mov esi,ecx ;esi := abs(x2-x1)
sub esi,eax
jnc #0
neg esi
#0: mov edi,edx ;edi := abs(y2-y1)
sub edi,ebx
jnc #1
neg edi
#1: cmp esi,0
je #9
cmp edi,0
je #10
cmp esi,edi ;abs(x2-x1) と abs(y2-y1) を比較する
je #2
jg #3
jmp #11
#9: ;-------------[xlen = 0]
mov [linetype],3
jmp #4
#10: ;-------------[ylen = 0]
mov [linetype],4
jmp #4
#11: ;-------------[xlen < ylen]
mov [linetype],1
xchg esi,edi
xchg eax,ebx
xchg ecx,edx
jmp #4
#2: ;-------------[xlen = ylen]
mov [linetype],2
jmp #4
#3: ;-------------[xlen > ylen]
mov [linetype],0
#4:
cmp eax,ecx ;長辺側の座標を小・大の順にする
jng #6
xchg eax,ecx
xchg ebx,edx
#6:
mov [ydir],1 ;短辺側座標の増分を決める
cmp ebx,edx
jng #7
mov [ydir],-1
#7:
inc esi ;長辺のドット数
mov [xlen],esi
inc edi ;短辺のドット数
mov [ylen],edi
setPOS p1,eax,ebx ;始点の位置情報
setPOS p2,ecx,edx ;終点の位置情報
cmp [linetype],2
jge #8
mov edx,edi ;傾き(短辺 / 長辺)の算出
xor eax,eax
mov ebx,esi
div ebx
mov [rate],eax
#8:
mov [ct],esi ;ct := xlen
mov [rateacc],0 ;傾き加算値の初期化
popad
ret
_gline_init endp
;● LINE のサブルーチン(水平/垂直線の場合)
;----------------------------------------------------------------------------
_gline_hv proc
pushad
cmp [linetype],3
jnz #0
mov ecx,edx
mov edx,esi
mov esi,edi
call _gvline
jmp #1
#0:
xchg ebx,ecx
mov edx,esi
mov esi,edi
call _ghline
#1:
popad
ret
_gline_hv endp
cseg ends
end